/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.logica;

import com.dao.CalendarioDAO;
import com.dao.ComentarioDAO;
import com.dao.EstadoDAO;
import com.dao.InmuebleDAO;
import com.dao.MensajeDAO;
import com.dao.MultimediaDAO;
import com.dao.PuntajeDAO;
import com.dao.ReservaDAO;
import com.dao.ServicioDAO;
import com.dao.TemporadaDAO;
import com.dao.UsuarioDAO;
import com.interfaces.IComercial;
import com.modelo.Calendario;
import com.modelo.Ciudad;
import com.modelo.Comentario;
import com.modelo.Estado;
import com.modelo.Inmueble;
import com.modelo.Mensaje;
import com.modelo.Multimedia;
import com.modelo.Puntaje;
import com.modelo.Reserva;
import com.modelo.Servicio;
import com.modelo.Temporada;
import com.modelo.Usuario;
import com.utilities.CorreoElectronico;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Properties;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.multipart.MultipartFile;

public class Comercial implements IComercial {

    @Autowired
    private UsuarioDAO usuarioDAO;
    @Autowired
    private InmuebleDAO inmuebleDAO;
    @Autowired
    private MultimediaDAO multimediaDAO;
    @Autowired
    private CalendarioDAO calendarioDAO;
    @Autowired
    private ComentarioDAO comentarioDAO;
    @Autowired
    private EstadoDAO estadoDAO;
    @Autowired
    private MensajeDAO mensajeDAO;
    @Autowired
    private PuntajeDAO puntajeDAO;
    @Autowired
    private ReservaDAO reservaDAO;
    @Autowired
    private ServicioDAO servicioDAO;
    @Autowired
    private TemporadaDAO temporadaDAO;

    @Override
    public Mensaje enviarMensaje(Usuario remitente, Usuario destinatario, Mensaje mensaje) {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }

    // by Aleja
    @Override
    public List<Comentario> ultimosComentariosDueño(Usuario dueño, int numero) {
        List<Comentario> ultimos = new ArrayList<Comentario>();
        List<Comentario> temp = comentarioDAO.listarComentariosPorUsuario(dueño);
        
        for(int i=(temp.size()-1); i>((temp.size()-1)-numero);i--){
            ultimos.add(temp.get(i));
        }
        
        return ultimos;
    }

    @Override
    public List<Puntaje> listadoPuntajesInmueble(Inmueble inmueble) {
        return puntajeDAO.listarPuntajesPorInmueble(inmueble);
    }
    
    @Override
    public List<Mensaje> consultarMensajesPorDueño(Usuario usu){
        return mensajeDAO.consultarMensajesPorUsuario(usu);
    }
    
    
    @Override
    public List<Comentario> consultarComentariosPorInmueble(Inmueble inm){
        return comentarioDAO.listarComentariosPorInmueble(inm);
    }
    
    @Override
    public List<Reserva> ingresosPorFecha(Inmueble inmueble, Date fechaIncio, Date fechaFin) {
        return reservaDAO.consultarReservasPorFecha(inmueble, fechaIncio, fechaFin);
    }
    
    @Override
    public List<Reserva> ingresosPorInmueble(Usuario dueño, Inmueble inmueble) {
        return reservaDAO.consultarReservasPorInmueble(inmueble);
    }

     //fin

    @Override
    public List<Reserva> historialAlquilerDueño(Usuario dueño) {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }

    @Override
    public List<Reserva> historialAlquilerCliente(Usuario Cliente) {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }

    @Override
    public List<Inmueble> buscarInmueblePorTitulo(String titulo) {
        Inmueble inmueble = new Inmueble();
        inmueble.setTitulo(titulo);
        return inmuebleDAO.listarInmueblePorTitulo(inmueble);
    }

    @Override
    public List<Inmueble> buscarInmueblePorCiudad(Ciudad ciudad) {
        return inmuebleDAO.listarInmueblePorCiudad(ciudad);
    }

    @Override
    public Usuario modificarPrivacidad(Usuario usuario) {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }

    @Override
    public boolean guardarRutaMultimedia(MultipartFile file) {
        boolean resultado = false;

        try {
            InputStream inputStream = null;
            OutputStream outputStream = null;
            if (file.getSize() > 0) {
                inputStream = file.getInputStream();
// File realUpload = new File("C:/");
                outputStream = new FileOutputStream("C:\\Users\\Seysame\\Dropbox\\OCTAVO SEMESTRE\\Aplicaciones Web en Java I\\Proyecto Final\\trunk\\ProyectoWeb\\web\\multimedia\\" + file.getOriginalFilename());
///C:\Users\Seysame\Dropbox\Aplicaciones Web Proyecto\TallerRevistaCreativa\web\images
//System.out.println(file.getOriginalFilename());

                int readBytes = 0;
                byte[] buffer = new byte[8192];
                while ((readBytes = inputStream.read(buffer, 0, 8192)) != -1) {

                    outputStream.write(buffer, 0, readBytes);
                }
                outputStream.close();
                inputStream.close();

            }
            resultado = true;
        } catch (Exception e) {
            e.printStackTrace();
            return resultado;
        }






        return resultado;



    }

    @Override
    public boolean validarCapacidad(Reserva reserva, Inmueble inmueble) {

        boolean resultado = false;

        Inmueble buscado = buscarInmueble(inmueble);

        if (buscado != null) {
            BigDecimal cantidadR = reserva.getHuespedes();
            BigDecimal cantidadI = buscado.getCapacidad();

            if (cantidadR.intValue() <= cantidadI.intValue()) {
                resultado = true;
            }
        }

        return resultado;

    }

    @Override
    public void enviarPeticionReserva(Reserva reserva, CorreoElectronico correo) {

        Reserva temporal = buscarReserva(reserva);
        if (temporal != null) {
            Usuario cliente = temporal.getUsuario();
            Usuario dueño = temporal.getInmueble().getUsuario();




            Properties props = new Properties();

            // Nombre del host de correo, es smtp.gmail.com
            props.setProperty("mail.smtp.host", "smtp.gmail.com");

            // TLS si est� disponible
            props.setProperty("mail.smtp.starttls.enable", "true");

            // Puerto de gmail para envio de correos
            props.setProperty("mail.smtp.port", "587");

            // Nombre del usuario
            props.setProperty("mail.smtp.user", "pi2osr@gmail.com");

            // Si requiere o no usuario y password para conectarse.
            props.setProperty("mail.smtp.auth", "true");

            Session session = Session.getDefaultInstance(props);
            session.setDebug(true);

            MimeMessage message = new MimeMessage(session);


            try {

                // Quien envia el correo
                message.setFrom(new InternetAddress("pi2osr@gmail.com"));
                //List<Usuario> destinatarios = obtenerClientesNotificaciones();

                //for (Usuario usuario : destinatarios) {

                // A quien va dirigido
                Transport t = session.getTransport("smtp");
                message.addRecipient(Message.RecipientType.TO, new InternetAddress(dueño.getCorreoElectronico()));

                message.setSubject(correo.getAsunto());
                message.setText(correo.getMensaje());

                System.out.println("Entro");

                t.connect("pi2osr@gmail.com", "osrpassword");
                t.sendMessage(message, message.getAllRecipients());
                t.close();


            } catch (AddressException e) {
                e.printStackTrace();
            } catch (MessagingException e) {
                e.printStackTrace();
            }

        }


    }

    @Override
    public boolean aceptacionReserva(Reserva reserva) {
        boolean resultado = false;
        Reserva temporal = buscarReserva(reserva);
        List<Estado> estados = listarEstados();

        if (temporal != null) {
            Estado temp = new Estado();
            for (int i = 0; i < estados.size(); i++) {
                if (estados.get(i).getNombre().equals("Medio Completa")) {
                    temp = estados.get(i);
                }
            }
            temporal.setEstado(temp);

            Reserva proceso = modificarReserva(temporal);
            resultado = true;

        }

        return resultado;

    }

    @Override
    public boolean validarTemporada(Temporada temporada, Calendario calendario) {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }

    @Override
    public Usuario iniciarSesion(Usuario usuario) {
        Usuario temp = buscarUsuarioPorCorreo(usuario);
        if (temp == null) {
            return null;
        } else {
            if (temp.getContrasena().equals(usuario.getContrasena())) {
                return temp;
            } else {
                return null;
            }
        }
    }
   
    
    
    

    public boolean registrarUsuario(Usuario usuario) {
        return usuarioDAO.registrarUsuario(usuario);
    }

    public List<Usuario> listarUsuarios() {
        return usuarioDAO.listarUsuarios();
    }

    public Usuario buscarUsuario(Usuario usu) {
        return usuarioDAO.buscarUsuario(usu);
    }
    
    public List<Reserva> historialInmueble(Usuario usu) {
        return usuarioDAO.historialInmueble(usu);
    }
    
    public Usuario buscarUsuarioPorCorreo(Usuario usu) {
        return usuarioDAO.buscarUsuarioPorCorreo(usu);
    }

    public List<Inmueble> listarInmuebles() {
        return inmuebleDAO.listarInmuebles();
    }

    ;
    
    public Inmueble buscarInmueble(Inmueble inmueble) {
        return inmuebleDAO.buscarInmueble(inmueble);
    }

    ;
    
    public Inmueble registrarInmueble(Inmueble inmueble) {
        return inmuebleDAO.registrarInmueble(inmueble);
    }

    ;
    
    public Inmueble modificarInmueble(Inmueble inmueble) {
        return inmuebleDAO.modificarInmueble(inmueble);
    }

    ;
    
    public List<Inmueble> listarInmueblesPorDueño(Usuario dueño) {
        return inmuebleDAO.listarInmueblesPorDueño(dueño);
    }

    ;
    
    public List<Inmueble> listarInmueblePorTitulo(Inmueble inmueble) {
        return inmuebleDAO.listarInmueblePorTitulo(inmueble);
    }

    ;
    
    public List<Inmueble> listarInmueblePorCiudad(Ciudad ciudad) {
        return inmuebleDAO.listarInmueblePorCiudad(ciudad);
    }

    ;
    
    
     public Multimedia registrarMultimedia(Multimedia multimedia) {
        return multimediaDAO.registrarMultimedia(multimedia);
    }  
     
     ;
     
    public List<Multimedia> listarMultimedias(){
    return multimediaDAO.listarMultimedias();
    };
    
    public Multimedia buscarMultimedia(Multimedia multimedia){
    return multimediaDAO.buscarMultimedia(multimedia);
    };
    
    public Multimedia modificarMultimedia(Multimedia multimedia){
    return multimediaDAO.modificarMultimedia(multimedia);
    };
    
    public List<Multimedia>listarMultimediaPorInmueble(Inmueble inmueble){
    return multimediaDAO.listarMultimediaPorInmueble(inmueble);
    };
     
     
     
    
    public List<Reserva> listarReservas() {
        return reservaDAO.listarReservas();
    }

    ;
    
    public Reserva buscarReserva(Reserva reserva) {
        return reservaDAO.buscarReserva(reserva);
    }

    ;
    
    public Reserva registrarReserva(Reserva reserva) {
        return reservaDAO.registrarReserva(reserva);
    }

    ;
    
    public Reserva modificarReserva(Reserva reserva) {
        return reservaDAO.modificarReserva(reserva);
    }

    ;
    
    public List<Reserva> listarReservasPorInmueble(Inmueble inmueble) {
        return reservaDAO.listarReservasPorInmueble(inmueble);
    }

    ;
    
     public List<Reserva> listarReservasPorUsuario(Usuario cliente) {
        return reservaDAO.listarReservasPorUsuario(cliente);
    }

    ;
     
       public List<Estado> listarEstados() {

        return estadoDAO.listarEstados();
    }

    ;
    
    public Estado buscarEstado(Estado estado) {
        return estadoDAO.buscarEstado(estado);
    }

    ;
    
    public Estado registrarEstado(Estado estado) {
        return estadoDAO.registrarEstado(estado);
    }

    ;
    
    public Estado modificarEstado(Estado estado) {
        return estadoDAO.modificarEstado(estado);
    }

    ;
     
     public List<Servicio> listarServicios(){
     return servicioDAO.listarServicios();
     };
   
    public Servicio buscarServicio(Servicio servicio){
        return servicioDAO.buscarServicio(servicio);
    }; 
     
     public Servicio registrarServicio(Servicio servicio){
         return servicioDAO.registrarServicio(servicio);
     };
    
    public Servicio modificarServicio(Servicio servicio){
        return servicioDAO.modificarServicio(servicio);
    };
    
    
     
     
     
     
     
      public void setUsuarioDAO(UsuarioDAO usuarioDAO) {
        this.usuarioDAO = usuarioDAO;
    }

    public UsuarioDAO getUsuarioDAO() {
        return usuarioDAO;
    }

    public InmuebleDAO getInmuebleDAO() {
        return inmuebleDAO;
    }

    public void setInmuebleDAO(InmuebleDAO inmuebleDAO) {
        this.inmuebleDAO = inmuebleDAO;
    }

    public MultimediaDAO getMultimediaDAO() {
        return multimediaDAO;
    }

    public void setMultimediaDAO(MultimediaDAO multimediaDAO) {
        this.multimediaDAO = multimediaDAO;
    }

    public CalendarioDAO getCalendarioDAO() {
        return calendarioDAO;
    }

    public void setCalendarioDAO(CalendarioDAO calendarioDAO) {
        this.calendarioDAO = calendarioDAO;
    }

    public ComentarioDAO getComentarioDAO() {
        return comentarioDAO;
    }

    public void setComentarioDAO(ComentarioDAO comentarioDAO) {
        this.comentarioDAO = comentarioDAO;
    }

    public EstadoDAO getEstadoDAO() {
        return estadoDAO;
    }

    public void setEstadoDAO(EstadoDAO estadoDAO) {
        this.estadoDAO = estadoDAO;
    }

    public MensajeDAO getMensajeDAO() {
        return mensajeDAO;
    }

    public void setMensajeDAO(MensajeDAO mensajeDAO) {
        this.mensajeDAO = mensajeDAO;
    }

    public PuntajeDAO getPuntajeDAO() {
        return puntajeDAO;
    }

    public void setPuntajeDAO(PuntajeDAO puntajeDAO) {
        this.puntajeDAO = puntajeDAO;
    }

    public ReservaDAO getReservaDAO() {
        return reservaDAO;
    }

    public void setReservaDAO(ReservaDAO reservaDAO) {
        this.reservaDAO = reservaDAO;
    }

    public ServicioDAO getServicioDAO() {
        return servicioDAO;
    }

    public void setServicioDAO(ServicioDAO servicioDAO) {
        this.servicioDAO = servicioDAO;
    }

    public TemporadaDAO getTemporadaDAO() {
        return temporadaDAO;
    }

    public void setTemporadaDAO(TemporadaDAO temporadaDAO) {
        this.temporadaDAO = temporadaDAO;
    }
}
